<html>
    <head>
        <title>权限管理模块  PermissionManagement</title>
    </head>
    <body>
        <script>
            // 权限管理模块  Permission Management Module

                    /*
                        该模块实现了 IPermissionStore 来存储和管理数据库中的权限值。
                    */

                    /*
                        一、如何安装 How to Instal

                                该模块是预装的（作为NuGet/NPM包）。
                                
                                您可以继续将其作为包使用并轻松获取更新，或者您可以将其源代码包含到您的解决方案中（请参阅get-sourceCLI命令）以开发您的自定义模块。
                    */

                    /*
                        二、源代码  The Source Code 

                                该模块的源代码可以在here访问。源代码获得了MIT的许可，因此您可以自由使用和自定义它。
                    */

                    /*
                        三、用户界面 UI 

                                权限管理模块提供了一个可重用对话框来管理与对象相关的权限。
                                
                                例如，身份模块使用它来管理用户和角色的权限。下图显示了身份模块的角色管理页面：

                                当您单击角色的Actions->权限时，将打开权限管理对话框。此对话框中的示例屏幕截图：

                                在此对话框中，您可以授予所选角色的权限。左侧的选项卡表示主要权限组，右侧包含在所选组中定义的权限。
                    */


                    /*
                        四、IPermissionManager  权限管理器接口

                                IPermissionManager 是该模块提供的主要功能。

                                它用于读取和更改权限值。

                                IPermissionManager 通常由权限管理对话框使用。但是，如果你需要设置权限值，你可以注入它。

                                (如果只想读取/检查当前用户的权限值，请使用IAuthorizationService或[Authorize]属性，如授权文档中所述。)


                                    eg:  使用 IPermissionManager 服务向角色和用户授予权限

                                            public class MyService : ITransientDependency
                                            {
                                                private readonly IPermissionManager _permissionManager;

                                                public MyService(IPermissionManager permissionManager)
                                                {
                                                    _permissionManager = permissionManager; // 注入权限管理器服务
                                                }

                                                public async Task GrantRolePermissionDemoAsync(
                                                    string roleName, string permission)
                                                {
                                                    await _permissionManager
                                                        .SetForRoleAsync(roleName, permission, true); // 给角色授予权限
                                                }

                                                public async Task GrantUserPermissionDemoAsync(
                                                    Guid userId, string roleName, string permission)
                                                {
                                                    await _permissionManager
                                                        .SetForUserAsync(userId, permission, true);  // 给用户授予权限
                                                }
                                            }
                    */


                    /*
                        五、权限管理提供程序  Permission Management Providers

                                权限管理模块是可扩展的，就像"权限系统"一样。

                                你可以通过"定义权限管理提供程序"来扩展它。

                                Identity 模块定义了以下权限管理提供程序：

                                        ①、UserPermissionManagementProvider：管理基于用户的权限。

                                        ②、RolePermissionManagementProvider：管理基于角色的权限。

                                IPermissionManager在获取/设置权限时使用这些提供程序。 

                                您可以通过实现IPermissionManagementProvider或继承自PermissionManagementProvider基类来定义自己的提供程序。


                                        eg:  
                                            public class CustomPermissionManagementProvider : PermissionManagementProvider
                                            {
                                                public override string Name => "Custom";

                                                public CustomPermissionManagementProvider(
                                                    IPermissionGrantRepository permissionGrantRepository, // 权限授予存储库
                                                    IGuidGenerator guidGenerator,  // 生成有序GUI
                                                    ICurrentTenant currentTenant)
                                                    : base(
                                                        permissionGrantRepository,
                                                        guidGenerator,
                                                        currentTenant)
                                                {
                                                }
                                            }

                                PermissionManagementProvider基类为您创建默认实现（使用IPermissionGrantRepository）。
                                
                                您可以根据需要覆盖基本方法。每个提供程序都必须有一个唯一的名称，在本例中为Custom（保持简短，因为它保存到每个权限值记录的数据库中）。


                                创建提供程序类后，应使用PermissionManagementOptions选项类注册它：

                                            Configure<PermissionManagementOptions>(options =>
                                            {
                                                options.ManagementProviders.Add<CustomPermissionManagementProvider>();
                                            });

                                提供程序的顺序很重要。提供程序以相反的顺序执行。
                                
                                这意味着CustomPermissionManagementProvider在此示例中首先执行。
                                
                                您可以按Providers列表中的任何顺序插入您的提供程序。
                    */
        </script>
    </body>
</html>